/* 头文件声明区 */
#include <STC15F2K60S2.H>
#include <stdio.h>
#include <Init.h>
#include <Seg.h>
#include <Key.h>
#include <Led.h>
#include <ds1302.h>
#include <iic.h>
#include <onewire.h>
#include <ultrasonic.h>
#include <Uart.h>

#define uchar unsigned char
#define uint unsigned int

/* 变量声明区 */
uchar Key_Val,Key_Down,Key_Up,Key_Old;
uchar Key_Slow_Down;
uint Seg_Slow_Down;
uchar Seg_Buf[8] = {10,10,10,10,10,10,10,10};
uchar Seg_Point[8] = {0,0,0,0,0,0,0,0};
uchar Seg_Pos;
uchar ucLed[8] = {0,0,0,0,0,0,0,0};
uchar Uart_Slow_Down;
uchar Uart_Recv[10];
uchar Uart_Index;
uint Freq;
uint Timer1000Ms; 


/* 键盘处理函数 */
void Key_Proc(){
    if(Key_Slow_Down)return;
    Key_Slow_Down = 1;

    Key_Val = Key_Read();
    Key_Down = Key_Val & (Key_Val ^ Key_Old);
    Key_Up = ~Key_Val & (Key_Val ^ Key_Old);
    Key_Old = Key_Val;
}

/* 数码管处理函数 */
void Seg_Proc(){
    if(Seg_Slow_Down)return;
    Seg_Slow_Down = 1;

}

/* 串口处理函数 */
void Uart_Proc(){
    if(Uart_Slow_Down)return;
    Uart_Slow_Down = 1;
}
/* 其他处理函数 */
void Led_Proc(){

}
/* 定时器0初始化函数 */
void Timer0Init(void)		//0毫秒@12.000MHz
{
	AUXR &= 0x7F;		//定时器时钟12T模式
	TMOD &= 0xF0;		//设置定时器模式
    TMOD |= 0X05;   //用与ne555计频率
	TL0 = 0x00;		//设置定时初始值
	TH0 = 0x00;		//设置定时初始值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
}

/* 定时器1初始化函数 */
void Timer1Init(void)		//1毫秒@12.000MHz
{
	AUXR &= 0xBF;		//定时器时钟12T模式
	TMOD &= 0x0F;		//设置定时器模式
	TL1 = 0x18;		//设置定时初始值
	TH1 = 0xFC;		//设置定时初始值
	TF1 = 0;		//清除TF1标志
	TR1 = 1;		//定时器1开始计时
    ET1 = 1;
    EA = 1;
}

/* 定时器1服务函数 */
void Timer1Server() interrupt 3{
    if(++Key_Slow_Down == 10)Key_Slow_Down = 0;
    if(++Seg_Slow_Down == 500)Seg_Slow_Down = 0;
    if(++Uart_Slow_Down == 200)Uart_Slow_Down = 0;
    if(++Seg_Pos == 8)Seg_Pos = 0;
    Seg_Disp(Seg_Pos,Seg_Buf[Seg_Pos],Seg_Point[Seg_Pos]);
    Led_Disp(Seg_Pos,ucLed[Seg_Pos]);

    if(++Timer1000Ms == 1000){
        TR0 = 0;
        Timer1000Ms = 0;
        Freq = TH0 << 8 | TL0;
        TH0 = TL0 = 0;
        TR0 = 1;
    }
}
/* 串口服务函数 */
void UartServer() interrupt 4{
    if(RI == 1){
        Uart_Recv[Uart_Index] = SBUF;
        Uart_Index++;
        RI = 0;
    }
}
/* 主函数 */
void main(){
    System_Init();
    Timer0Init();
    Timer1Init();
    UartInit();
    while(1){
        Key_Proc();
        Seg_Proc();
        Uart_Proc();
        Led_Proc();
    }
}